package manager.principal.dao;

import java.sql.SQLException;
import manager.auxiliares.MensagemExcessao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.LinkedList;
import manager.auxiliares.Configurations;
import manager.auxiliares.Format;
import manager.principal.fonte.JanelaLogin;
import manager.interfaces.InterfaceDao;

/**
 * Esta classe será utilizada para cadastra a entidade Profissão no banco de
 * dados
 *
 * @author Thiago
 */
public class ProfissaoDao implements InterfaceDao {

    private int id;
    private String nome;

    /**
     * Inicializando as variáveis
     */
    public ProfissaoDao() {
        nome = "";
        id = 0;
    }

    /**
     * Buscar o id de uma Profissao pelo nome da mesma
     *
     * @param name Nome da profissao a ser buscada
     * @return Id da da profissao encontrata, 0 quando não encontra
     */
    public static int getIdProfissaoPorNome(String name) {
        try {

            String sql = "SELECT id FROM profissao WHERE tx_nome = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setString(1, name);
            ResultSet resultSet = preparedStatement.executeQuery();
            int idCity = 0;
            if (resultSet.first()) {
                idCity = resultSet.getInt("id");
            }
            resultSet.close();
            preparedStatement.close();
            return idCity;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Profissoes");
            return 0;
        }
    }

    /**
     * Buscar o nome de uma Profissao pelo id da mesma
     *
     * @param idProfissao id da profissao a ser buscada
     * @return Id da da profissao encontrata, 0 quando não encontra
     */
    public static String getNomeProfissaoPorId(int idProfissao) {
        try {

            String sql = "SELECT tx_nome FROM profissao WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, idProfissao);
            ResultSet resultSet = preparedStatement.executeQuery();
            String nomeProfissao = "";
            if (resultSet.first()) {
                nomeProfissao = resultSet.getString("tx_nome");
            }
            resultSet.close();
            preparedStatement.close();
            return nomeProfissao;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Profissoes");
            return "";
        }
    }

    public LinkedList<String> buscar(String option, String search, boolean limite) throws SQLException {
        LinkedList<String> result = new LinkedList<String>();
        if (!search.equals("")) {
            String sql = "";
            String tamanhoBusca = limite ? ("LIMIT 0," + Configurations.getAutoCompleteSizeSearch()) : "";
            if (option.equalsIgnoreCase("Nome")) {
                sql = "SELECT tx_nome FROM profissao WHERE tx_nome LIKE ? ORDER BY tx_nome  " + tamanhoBusca;
            }
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, search + "%");
                ResultSet resultSet = preparedStatement.executeQuery();
                while (resultSet.next()) {
                    result.add(resultSet.getString(1));
                }
            }
        }
        return result;
    }

    public static LinkedList searchTable() throws SQLException {
        LinkedList result = new LinkedList();
        String sql = "SELECT * FROM profissao ORDER BY tx_nome ";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();

        LinkedList<Integer> columnId = new LinkedList<Integer>();
        LinkedList<String> columnName = new LinkedList<String>();

        while (resultSet.next()) {
            columnId.add(resultSet.getInt("id"));
            columnName.add(resultSet.getString("tx_nome"));
        }

        result.add(columnId);
        result.add(Format.getBooleanLinkedList(columnId.size()));
        result.add(columnName);
        return result;
    }

    /**
     * Carregar as informações do objeto usuário a partir de um id
     *
     * @param id Id do usuário buscado
     */
    public void buscar(int id) {
        try {
            setId(id);
            String sql = "SELECT * FROM profissao WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.first()) {
                nome = resultSet.getString("tx_nome");
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Estados");
        }
    }

    /**
     * Insere um usuário no banco
     */
    public void inserir() throws SQLException {
        String sql = "INSERT INTO cidade (tx_nome) VALUES(?)";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setString(1, nome);
        preparedStatement.executeUpdate();

        //Recebendo o novo id gerado
        ResultSet resultSet = preparedStatement.getGeneratedKeys();
        while (resultSet.next()) {
            id = resultSet.getInt(1);
        }

        preparedStatement.close();
        resultSet.close();
    }

    /**
     * Atualiza o usuário no banco
     */
    public void atualizar() throws SQLException {
        String sql = "UPDATE estado SET tx_nome = ? WHERE id = ?";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setString(1, nome);
        preparedStatement.setInt(2, id);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public void deletar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
